包名 结绳.Meng

/*
*
*	 @阿杰	Meng
*
*	 有问题请联系：q2217444740
*
*/

@外部依赖库("../../安卓基本库/依赖库/androidx/annotation-1.1.0.jar")
@外部依赖库("../../安卓基本库/依赖库/androidx/core-1.3.0.aar")
@外部依赖库("../../安卓基本库/依赖库/androidx/collection-1.1.0.jar")
@外部依赖库("../../安卓基本库/依赖库/androidx/customview-1.1.0.aar")
@外部依赖库("../../安卓基本库/依赖库/androidx/recyclerview-1.1.0.aar")
@导入Java("androidx.recyclerview.widget.*")
@导入Java("androidx.recyclerview.widget.RecyclerView.*")
@导入Java("android.view.*")
@导入Java("android.widget.*")
类 高级列表框 : 可视化组件

	@隐藏
	变量 适配器 : 高级适配器?
	@隐藏
	变量 布局器 : 布局管理器?

	@code
	public #<高级列表框>(android.content.Context context) {
		super(context);
		getView().addOnScrollListener(new RecyclerView.OnScrollListener() {
			@Override
			public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
				super.onScrollStateChanged(recyclerView, newState);
				#滚动状态(newState);
			}
			@Override
			public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
				super.onScrolled(recyclerView, dx, dy);
				#滚动事件(dx,dy);
			}
		});
	}

	@Override
	public androidx.recyclerview.widget.RecyclerView onCreateView(android.content.Context context) {
		androidx.recyclerview.widget.RecyclerView view = new androidx.recyclerview.widget.RecyclerView(context);
		view.setLayoutManager((#布局器 = new #<线性布局管理器>(context)).getLM());
		/*view.addOnItemTouchListener(new ItemClickListener(view){
			public void onItemClick(#<组件容器> v, int p){
				#项目被单击(v,p);
				if(#适配器 != null) #<适配器.项目被单击>(v,p);
			};
			public void onItemLongClick(#<组件容器> v, int p){
				#项目被长按(v,p);
				if(#适配器 != null) #<适配器.项目被长按>(v,p);
			};
		});*/
		return view;
	}

	public androidx.recyclerview.widget.RecyclerView getView() {return (androidx.recyclerview.widget.RecyclerView) view;}
	 
	public class ItemClickListener extends RecyclerView.SimpleOnItemTouchListener{
		protected void onItemClick(#<组件容器> view, int position){};
		protected void onItemLongClick(#<组件容器> view, int position){};
		private GestureDetector mGestureDetectorCompat;
		public ItemClickListener(RecyclerView recyclerView){
			mGestureDetectorCompat = new GestureDetector(recyclerView.getContext(), new GestureDetector.OnGestureListener() {
				public boolean onDown(MotionEvent e) {return false;}
				public void onShowPress(MotionEvent e) {}
				public boolean onSingleTapUp(MotionEvent e) {
					View childView = recyclerView.findChildViewUnder(e.getX(), e.getY());
					if (childView != null) onItemClick(((#<高级适配器>.VH)recyclerView.findContainingViewHolder(childView)).rq, recyclerView.getChildAdapterPosition(childView));
					return true;
				}
				public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {return false;}
				public void onLongPress(MotionEvent e) {
					View childView = recyclerView.findChildViewUnder(e.getX(), e.getY());
					if (childView != null) onItemLongClick(((#<高级适配器>.VH)recyclerView.findContainingViewHolder(childView)).rq, recyclerView.getChildAdapterPosition(childView));
				}
				public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {return false;}
        	});
		}
		public void onTouchEvent(RecyclerView rv, MotionEvent e) {
			if (!mGestureDetectorCompat.onTouchEvent(e)) super.onTouchEvent(rv, e);
		}
		public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
			if (!mGestureDetectorCompat.onTouchEvent(e)) return super.onInterceptTouchEvent(rv, e);
			return true;
		}
	}
	@end
	
	属性写 项目视图缓存大小(数量 : 整数)
		code getView().setItemViewCacheSize(#数量);
	结束 属性

	属性写 固定项目大小(是否固定 : 逻辑型)
		code getView().setHasFixedSize(#是否固定);
	结束 属性

	属性写 冻结布局(是否冻结 : 逻辑型)
		code getView().setLayoutFrozen(#是否冻结);
	结束 属性

	方法 滚动到(索引 : 整数, 动画时长 : 小数 = 0)
		@code
		if(#动画时长 == 0f){
			getView().scrollToPosition(#索引);
		} else {
			androidx.recyclerview.widget.LinearSmoothScroller s = new androidx.recyclerview.widget.LinearSmoothScroller(#取安卓环境()){
	 			@Override
	 			protected float calculateSpeedPerPixel(android.util.DisplayMetrics displayMetrics) {
		  			return ((float)#动画时长) / displayMetrics.densityDpi;
	 			}
	 			@Override
	 			protected void onTargetFound(android.view.View targetView, RecyclerView.State state, Action action) {
		  			int dy = calculateDyToMakeVisible(targetView, getVerticalSnapPreference());
		  			int time = calculateTimeForDeceleration(dy);
		  			if (time > 0) action.update(0, -dy, time, mDecelerateInterpolator);
	 			}
			};
			s.setTargetPosition(#索引);
			getView().getLayoutManager().startSmoothScroll(s);
		}
		@end
	结束 方法

	方法 置布局管理器(布局管理器 : 布局管理器)
		code getView().setLayoutManager((#布局器 = #布局管理器).getLM());
		code #布局器.setRv(this);
	结束 方法

	code SnapHelper snap;

	方法 分页模式(是否 : 逻辑型 = 真, 惯性 : 逻辑型 = 假)
		code if(#是否) (snap = #惯性 ? new LinearSnapHelper() : new PagerSnapHelper()).attachToRecyclerView(getView()); else if(snap!=null) snap.attachToRecyclerView(getView());
	结束 方法
	
	方法 取分页位置索引() : 整数
		code return ((RecyclerView.LayoutParams)getView().getChildAt(0).getLayoutParams()).getViewAdapterPosition();
	结束 方法

	方法 置分割线(分割线 : 分割线)
		code getView().addItemDecoration(#分割线.getIDN());
	结束 方法

	方法 置适配器(适配器 : 高级适配器)
		本对象.适配器 = 适配器
		code #适配器.setl(this);
		code getView().setAdapter(#适配器);
	结束 方法

	方法 取适配器() : 高级适配器
		返回 适配器
	结束 方法

	方法 取布局管理器() : 布局管理器
		返回 布局器
	结束 方法

	方法 内容高度() : 整数
		code return getView().computeVerticalScrollRange();
	结束 方法

	方法 内容宽度() : 整数
		code return getView().computeHorizontalScrollRange();
	结束 方法

	方法 显示区域高度() : 整数
		code return getView().computeVerticalScrollExtent();
	结束 方法

	方法 显示区域宽度() : 整数
		code return getView().computeHorizontalScrollExtent();
	结束 方法

	方法 已滚动高度() : 整数
		code return getView().computeVerticalScrollOffset();
	结束 方法

	方法 已滚动宽度() : 整数
		code return getView().computeHorizontalScrollOffset();
	结束 方法

	方法 已滚动高度百分比() : 小数
		返回 (已滚动高度() * 1d/ (内容高度() - 显示区域高度()))
	结束 方法

	方法 已滚动宽度百分比() : 小数
		返回 (已滚动宽度() * 1d/ (内容宽度() - 显示区域宽度()))
	结束 方法

	方法 是否到顶() : 逻辑型
		code return !getView().canScrollVertically(-1);
	结束 方法

	方法 是否到底() : 逻辑型
		code return !getView().canScrollVertically(1);
	结束 方法

	方法 是否正在播放动画() : 逻辑型
		code return getView().isAnimating();
	结束 方法

	方法 是否正在计算布局() : 逻辑型
		code return getView().isComputingLayout();
	结束 方法

	方法 取滚动状态() : 整数
		code return getView().getScrollState();
	结束 方法
	
	//定义事件 项目被单击(容器 : 组件容器, 索引 : 整数)
	//定义事件 项目被长按(容器 : 组件容器, 索引 : 整数)

	// 1:被拖拽， 2:惯性滚动， 0:停止
	定义事件 滚动状态(状态 : 整数)

	//手动滑动时触发
	定义事件 滚动事件(X : 整数, Y : 整数)

结束 类

@导入Java("androidx.recyclerview.widget.RecyclerView")
@后缀代码("extends androidx.recyclerview.widget.RecyclerView.Adapter")
@全局类
类 高级适配器

	@隐藏
	变量 数据 : 集合?
	@隐藏
	变量 数量 : 整数 = -1
	@隐藏
	变量 列表 : 高级列表框?
	@隐藏
	变量 环境 : 安卓环境?

	@code
	public #<高级适配器>(){}
	public #<高级适配器>(java.util.ArrayList l){#数据 = l;}
	
	public void setl(#<高级列表框> l){
		this.#列表 = l;
		this.#环境 = #<列表.取安卓环境>();
	}
	@end

	@静态
	方法 创建适配器(集合 : 集合) : 高级适配器
		code return new #<高级适配器>(#集合);
	结束 方法

	@嵌入式代码
	@运算符重载
	方法 =(集合 : 集合)
		code new #<高级适配器>(#集合);
	结束 方法

	//使用集合， 更新数量
	方法 更新项目()
		本对象.数量 = -1
		code this.notifyDataSetChanged();
	结束 方法

	//不使用集合， 直接更新数量
	方法 更新项目数量(数量 : 整数)
		code this.#数据 = null;
		本对象.数量 = 数量
		code this.notifyDataSetChanged();
	结束 方法

	方法 更新指定项目(索引 : 整数, 数量 : 整数 = 1)
		code if(#数量==1) this.notifyItemChanged(#索引);
		code else this.notifyItemRangeChanged(#索引,#数量);
	结束 方法

	方法 更新插入项目(索引 : 整数, 数量 : 整数 = 1)
		code if(#数量==1) this.notifyItemInserted(#索引);
		code else this.notifyItemRangeInserted(#索引,#数量);
	结束 方法

	方法 更新移动项目(移动索引 : 整数, 目标索引 : 整数)
		code this.notifyItemMoved(#移动索引,#目标索引);
	结束 方法

	方法 更新移除项目(索引 : 整数, 数量 : 整数 = 1)
		code if(#数量==1) this.notifyItemRemoved(#索引);
		code else this.notifyItemRangeRemoved(#索引,#数量);
	结束 方法

	方法 固定项目ID(是否 : 逻辑型)
		code this.setHasStableIds(#是否);
	结束 方法

	方法 取项目类型(索引 : 整数) : 整数
		code return this.getItemViewType(#索引);
	结束 方法

	方法 取项目数量() : 整数
		code return this.getItemCount();
	结束 方法

	
	

	//使用集合时返回数据，反则为空
	方法 取数据() : 集合
		返回 数据
	结束 方法

	方法 置数据(集合 : 集合)
		本对象.数据 = 集合
		更新项目()
	结束 方法

	方法 取列表() : 高级列表框
		返回 列表
	结束 方法

	方法 取布局管理器() : 布局管理器
		返回 取列表().取布局管理器()
	结束 方法

	@code
	@Override
	public RecyclerView.ViewHolder onCreateViewHolder(android.view.ViewGroup parent, int viewType) {
		#<组件容器> rq = #关联视图(viewType);
		return new VH(rq);
	}
	
	int pr;
	
	@Override
	public void onBindViewHolder(RecyclerView.ViewHolder holder,final int position){
	  int type = getItemViewType(pr = position);
	  VH vh = (VH)holder;
	  if(vh.p != position && vh.p != -1)
	  	#视图被复用(type, vh.rq, position, vh.p);
	  #关联视图数据(type, vh.rq, position);
	  vh.p = position;
	}
	
	@Override
	 public void onViewRecycled(RecyclerView.ViewHolder holder) {
		super.onViewRecycled(holder);
	 }
	 
	 @Override
	 public long getItemId(int p){
	 	return super.getItemId(p);
	 }

	@Override
	public int getItemCount() {
		return #数据 != null && #数量 == -1 ? #数据.size() : #数量 == -1 ? 0 : #数量;
	}

	@Override
	public int getItemViewType(int position){
		return #关联项目类型(position);
	}

	public class VH extends RecyclerView.ViewHolder{
		public #<组件容器> rq;
		public int p = -1;
		public VH(#<组件容器> r) {
			super(r.getLayout().getView());
			rq = r;
			if(rq.getLayout().getView().getChildCount() >= 1)
				rq.getLayout().getView().setLayoutParams(new android.view.ViewGroup.LayoutParams(rq.getLayout().getView().getChildAt(0).getLayoutParams()));
		}
	}
	@end

	//可选， 仅在需要 多个布局时使用
	定义事件 关联项目类型(索引 : 整数) : 整数

	//必要事件
	定义事件 关联视图(项目类型 : 整数) : 组件容器
	定义事件 关联视图数据(项目类型 : 整数, 容器 : 组件容器, 索引 : 整数)

	//可选，可实现对应逻辑
	定义事件 视图被复用(项目类型 : 整数, 容器 : 组件容器, 索引 : 整数, 被复用视图索引 : 整数)
	
	定义事件 项目被单击(容器 : 组件容器, 索引 : 整数)
	定义事件 项目被长按(容器 : 组件容器, 索引 : 整数)

	//为每一个项目设置固定的ID，可优化性能
	@属性需求.固定项目ID(真)
	定义事件 项目ID(索引 : 整数) : 整数

	@静态
	方法 高级适配器(集合 : 集合) : 高级适配器
		变量 适配器 : 高级适配器 = 集合
		返回 适配器
	结束 方法

	@静态
	方法 创建高级适配器(集合 : 集合) : 高级适配器
		变量 适配器 : 高级适配器 = 集合
		返回 适配器
	结束 方法

结束 类

@全局类
类 高级列表适配器 : 高级适配器

	code public #<高级列表适配器>(){}
	code public #<高级列表适配器>(java.util.ArrayList l){super(l);}

	@静态
	方法 创建适配器(集合 : 集合) : 高级列表适配器
		code return new #<高级列表适配器>(#集合);
	结束 方法

	@嵌入式代码
	@运算符重载
	方法 =(集合 : 集合)
		code new #<高级列表适配器>(#集合);
	结束 方法

	@静态
	方法 高级列表适配器(集合 : 集合) : 高级列表适配器
		变量 适配器 : 高级列表适配器 = 集合
		返回 适配器
	结束 方法

	@静态
	方法 创建高级列表适配器(集合 : 集合) : 高级列表适配器
		变量 适配器 : 高级列表适配器 = 集合
		返回 适配器
	结束 方法

结束 类